﻿========================================================
SMBX-38A file formats
========================================================
Developed by Chinese developer named as 5438A38A for usage in re-developed SMBX 1.4.x
(Unofficial implementation of SMBX Engine)
========================================================
	All files are written as ASCII-text. Every header contains line "SMBXFile??",
where ?? is a version number of file generator standard (first version is 65, latest 66).
Non-ASCII data is encoding into URI and BASE64 formats. Every line begins from a marker
of element type, and parameters are going in strict order. Parameters are separating
with "|" character, sub-parameters (extra parameters or array elements between one
parent parameter cell) are spliting with "/" or "," characters. Extra parameters are
allowed on end of every line (extra parameters are can be added to end of every
parameter chain, but replacing or appending into middle of this chain is not allowed).
Entries of extra types are allowed too, but there are must not use busy markers!

========================================================
LVL file specification
========================================================
Data type markers:
A 	    – Level header settings
P1, P2 	– Player spawn points
M       – Section settings
B       – blocks
T       – Background objects
N       – Non-playable characters
Q       – Liquid/Environment boxes
W       – Warp entries
L       – Layers
E       – Events
V       – Local level variables
S       – UTF-8 encoded local level scripts
Su      – ASCII-encoded local level scripts
--------------------------------------------------------
line 1:
	SMBXFile??
	??=Version number
next line: level settings
	A|param1|param2[|param3|param4]
	[]=optional
	param1=the number of stars on this level
	param2=level title
	param3=a filename, when player died, the player will be sent to this level.
	param4=normal entrance / to warp [0-WARPMAX]
next line: player start points
	P1|x1|y1
	P2|x2|y2
	x1=first player position x
	y1=first player position y
	x2=second player position x
	y2=second player position y
next line: section properties
	M|id|x|y|w|h|b1|b2|b3|b4|b5|b6|music|background|musicfile
	id=[1-SectionMAX]
	x=Left size[-left/+right]
	y=Top size[-down/+up]
	w=width of the section[if (w < 800) w = 800]
	h=height of the section[if (h < 600) h = 600]
	b1=under water?[0=false !0=true]
	b2=is x-level wrap[0=false !0=true]
	b3=enable off screen exit[0=false !0=true]
	b4=no turn back(x)[0=no x-scrolllock 1=scrolllock left 2=scrolllock right]
	b5=no turn back(y)[0=no y-scrolllock 1=scrolllock up 2=scrolllock down]
	b6=is y-level wrap[0=false !0=true]
	music=music number[same as smbx1.3]
	background=background number[same as the filename in 'background2' folder]
	musicfile=custom music file[***urlencode!***]
next line: blocks
	B|layer|id|x|y|contain|b1|b2|e1,e2,e3|w|h
	layer=layer name["" == "Default"][***urlencode!***]
	id=block id
	x=block position x
	y=block position y
	contain=containing npc number
		[1001-1000+NPCMAX] npc-id
		[1-999] coin number
		[0] nothing
	b1=slippery[0=false !0=true]
	b2=invisible[0=false !0=true]
	e1=block destory event name[***urlencode!***]
	e2=block hit event name[***urlencode!***]
	e3=no more object in layer event name[***urlencode!***]4
	w=width
	h=height
next line: backgrounds
	T|layer|id|x|y
	layer=layer name["" == "Default"][***urlencode!***]
	id=background id
	x=background position x
	y=background position y
next line: npcs
	N|layer|id|x|y|b1,b2,b3,b4|sp|e1,e2,e3,e4,e5,e6,e7|a1,a2|c1[,c2,c3,c4,c5,c6,c7]|msg|
	layer=layer name["" == "Default"][***urlencode!***]
	id=npc id
	x=npc position x
	y=npc position y
	b1=[1]left [-1]random [0]right
	b2=friendly npc
	b3=don't move npc
	b4=[1=npc91][2=npc96][3=npc283][4=npc284][5=npc300]
	sp=special option
		[***urlencode!***]
		e1=death event
		e2=talk event
		e3=activate event
		e4=no more object in layer event
		e5=grabed event
		e6=next frame event
		e7=touch event
		a1=layer name to attach
		a2=variable name to send
	c1=generator enable
		[if c1!=0]
		c2=generator period[1 frame]
		c3=generator effect
			c3-1[1=warp][0=projective][4=no effect]
			c3-2[0=center][1=up][2=left][3=down][4=right][9=up+left][10=left+down][11=down+right][12=right+up]
				if (c3-2)!=0
				c3=4*(c3-1)+(c3-2)
				else
				c3=0
		c4=generator direction[angle][when c3=0]
		c5=batch[when c3=0][MAX=32]
		c6=angle range[when c3=0]
		c7=speed[when c3=0][float]
	msg=message by this npc talkative[***urlencode!***]
next line: waters
	Q|layer|x|y|w|h|b1,b2,b3,b4,b5|event
	layer=layer name["" == "Default"][***urlencode!***]
	x=position x
	y=position y
	w=width
	h=height
	b1=liquid type
		01-Water[friction=0.5]
		02-Quicksand[friction=0.1]
		03-Custom Water
		04-Gravitational Field
		05-Event Once
		06-Event Always
		07-NPC Event Once
		08-NPC Event Always
		09-Click Event
		10-Collision Script
		11-Click Script
		12-Collision Event
		13-Air
	b2=friction
	b3=Acceleration Direction
	b4=Acceleration
	b5=Maximum Velocity
	event=touch event
next line: warps
	W|layer|x|y|ex|ey|type|enterd|exitd|sn,msg,hide|locked,noyoshi,canpick,bomb,hidef,anpc,mini,size|lik|liid|noexit|wx|wy|le|we
	layer=layer name["" == "Default"][***urlencode!***]
	x=entrance position x
	y=entrance postion y
	ex=exit position x
	ey=exit position y
	type=[1=pipe][2=door][0=instant]
	enterd=entrance direction[1=up 2=left 3=down 4=right]
	exitd=exit direction[1=up 2=left 3=down 4=right]
	sn=need stars for enter
	msg=a message when you have not enough stars
	hide=hide the star number in this warp
	locked=locked
	noyoshi=no yoshi
	canpick=allow npc
	bomb=need a bomb
	hide=hide the entry scene
	anpc=allow npc interlevel
	mini=Mini-Only
	size=Warp Size(pixel)
	lik=warp to level[***urlencode!***]
	liid=normal enterance / to warp[0-WARPMAX]
	noexit=level entrance
	wx=warp to x on world map
	wy=warp to y on world map
	le=level exit
	we=warp event[***urlencode!***]
next line: layers
	L|name|status
	name=layer name[***urlencode!***]
	status=is vizible layer
next line: events
	E|name|msg|ea|el|elm|epy|eps|eef|ecn|evc|ene
	name=event name[***urlencode!***]
	msg=show message after start event[***urlencode!***]
	ea=val,syntax
		val=[0=not auto start][1=auto start when level start][2=auto start when match all condition][3=start when called and match all condidtion]
		syntax=condidtion expression[***urlencode!***]
	el=b/s1,s2...sn/h1,h2...hn/t1,t2...tn
		b=no smoke[0=false !0=true]
		[***urlencode!***]
		s(n)=show layer
		l(n)=hide layer
		t(n)=toggle layer
	elm=elm1/elm2...elmn
		elm(n)=layername,horizontal syntax,vertical syntax,way
		layername=layer name for movement[***urlencode!***]
		horizontal syntax,vertical syntax[***urlencode!***][syntax]
		way=[0=by speed][1=by Coordinate]
	epy=b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12
		b1=enable player controls
		b2=drop
		b3=alt run
		b4=run
		b5=jump
		b6=alt jump
		b7=up
		b8=down
		b9=left
		b10=right
		b11=start
		b12=lock keyboard
	eps=esection/ebackground/emusic
		esection=es1:es2...esn
		ebackground=eb1:eb2...ebn
		emusic=em1:em2...emn
			es=id,x,y,w,h,auto,sx,sy
				id=section id
				stype=[0=don't change][1=default][2=custom]
				x=left x coordinates for section [id][***urlencode!***][syntax]
				y=top y coordinates for section [id][***urlencode!***][syntax]
				w=width for section [id][***urlencode!***][syntax]
				h=height for section [id][***urlencode!***][syntax]
				auto=enable autoscroll controls[0=false !0=true]
				sx=move screen horizontal syntax[***urlencode!***][syntax]
				sy=move screen vertical syntax[***urlencode!***][syntax]
			eb=id,btype,backgroundid
				id=section id
				btype=[0=don't change][1=default][2=custom]
				backgroundid=[when btype=2]custom background id
			em=id,mtype,musicid,customfile
				id=section id
				mtype=[0=don't change][1=default][2=custom]
				musicid=[when mtype=2]custom music id
				customfile=[when mtype=3]custom music file name[***urlencode!***]
	eef=sound/endgame/ce1/ce2...cen
		sound=play sound number
		endgame=[0=none][1=bowser defeat]
		ce(n)=id,x,y,sx,sy,grv,fsp,life
			id=effect id
			x=effect position x[***urlencode!***][syntax]
			y=effect position y[***urlencode!***][syntax]
			sx=effect horizontal speed[***urlencode!***][syntax]
			sy=effect vertical speed[***urlencode!***][syntax]
			grv=to decide whether the effects are affected by gravity[0=false !0=true]
			fsp=frame speed of effect generated
			life=effect existed over this time will be destroyed.
	ecn=cn1/cn2...cnn
		cn(n)=id,x,y,sx,sy,sp
			id=npc id
			x=npc position x[***urlencode!***][syntax]
			y=npc position y[***urlencode!***][syntax]
			sx=npc horizontal speed[***urlencode!***][syntax]
			sy=npc vertical speed[***urlencode!***][syntax]
			sp=advanced settings of generated npc
	evc=vc1/vc2...vcn
		vc(n)=name,newvalue
			name=variable name[***urlencode!***]
			newvalue=new value[***urlencode!***][syntax]
	ene=nextevent/timer/apievent/scriptname
		nextevent=name,delay
			name=trigger event name[***urlencode!***]
			delay=trigger delay[1 frame]
		timer=enable,count,interval,type,show
			enable=enable the game timer controlling[0=false !0=true]
			count=set the time left of the game timer
			interval=set the time count interval of the game timer
			type=to choose the way timer counts[0=counting down][1=counting up]
			show=to choose whether the game timer is showed in hud[0=false !0=true]
		apievent=the id of apievent
		scriptname=script name[***urlencode!***]
next line: variables
	V|name|value
	name=variable name[***urlencode!***]
	value=initial value of the variable
next line: scripts
	S|name|script
	Su|name|scriptu
	name=name of script[***urlencode!***]
	script=script[***base64encode!***][utf-8]
	scriptu=script[***base64encode!***][ASCII]


========================================================
WLD file description
========================================================
Data type markers:
ws1 	– World settings header
ws2 	– Credits
ws3 	– List of additional strings
ws4 	– Saving locker setup
T	    – Terrain tiles
S	    – Sceneries
P	    – Paths
M	    – Areas – Music boxes, viewports, etc.
L	    – Level entrances
WL	    – Layers
WE	    – Events
--------------------------------------------------------
line 1:
	SMBXFile??
	??=Version number
next line: world settings
	ws1|wn|bp1,bp2,bp3,bp4,bp5|asn|dtp,nwm,rsd,dcp,sc,sm,asg,smb3|sn,mis|acm|sc
	ws2|credits
	ws3|list
	ws4|se|msg
	wn=episode name[***urlencode!***]
	bp(n)=don't use player(n) as player's character
	asn=auto start level file name[***urlencode!***]
	dtp=disable two player[0=false !0=true]
	nwm=no world map[0=false !0=true]
	rsd=restart last level on player's character death[0=false !0=true]
	dcp=disable change player[0=false !0=true]
	sc=save machine code to sav file[0=false !0=true]
	sm=save mode
		-1=Restart at auto start level
		0=Restart at the world map where we saved last time
		1=Restart at the level where we saved last time
	asg=auto save game[0=false !0=true]
	smb3=smb3 style world map[0=false !0=true]
	sn=star number
	mis=max item number in world inventory
	acm=anti cheat mode[0=don't allow in list !0=allow in list]
	sc=enable save locker[0=false !0=true]
	credits=[1]
		#DEFT#xxxxxx[***base64encode!***]
		xxxxxx=name1 /n name2 /n ...
		[2]
		#CUST#xxxxxx[***base64encode!***]
		xxxxxx=any string
	list=xxxxxx[***base64encode!***]
		xxxxxx=string1,string2...stringn
	se=save locker syntax[***urlencode!***][syntax]
	msg=message when save was locked[***urlencode!***]
next line: tiles
	T|id|x|y|layer
	id=tile id
	x=tile position x
	y=tile position y
	layer=layer name["" == "Default"][***urlencode!***]
next line: scenerys
	S|id|x|y|layer
	id=scenery id
	x=scenery position x
	y=scenery position y
	layer=layer name["" == "Default"][***urlencode!***]
next line: paths
	P|id|x|y|layer
	id=path id
	x=path position x
	y=path position y
	layer=layer name["" == "Default"][***urlencode!***]
next line: Areas
	M|id|x|y|name|layer|w|h|flag|te,eflag|ie1,ie2,ie3
	id=music id
	x=Area position x
	y=Area position y
	name=custom music name[***urlencode!***]
	layer=layer name["" == "Default"][***urlencode!***]
	w=width
	h=height
	flag=area settings[***Bitwise operation***]
		0=False !0=True
		b1=(flag & 1) World Music
		b2=(flag & 2) Set Viewport
		b3=(flag & 4) Ship Route
		b4=(flag & 8) Forced Walking
		b5=(flag & 16) Item-triggered events
	te:Touch Event[***urlencode!***]
		eflag:0=Triggered every time entering
		      1=Triggered on entrance and level completion
                   2=Triggered only once
	ie1=Hammer Event[***urlencode!***]
	ie2=Warp Whistle Event[***urlencode!***]
	ie3=Anchor Event[***urlencode!***]
next line: levels
	L|id|x|y|fn|n|eu\el\ed\er|wx|wy|wlz|bg,pb,av,ls,f,nsc,otl,li,lcm|s|Layer|Lmt
	id=level id
	x=level position x
	y=level position y
	fn=level file name[***urlencode!***]
	n=level name[***urlencode!***]
	eu,el,ed,er=e[up,left,down,right]
		e=c1,c2,c3,c4
		c1,c2,c3=level exit type
		c4=condidtion expression[***urlencode!***][syntax]
		exit = (c1 || c2 || c3) && c4
	wx=go to world map position x
	wy=go to world map position y
	wlz=nunber of doors to warp
	bg=big background
	pb=path background
	av=always visible
	ls=is game start point
	f=forced
	nsc=no star coin count
	otl=destory after clear
	li=level ID
	lcm=Affected by Music Box
	s=entrance syntax
		s=ds1/ds2...dsn
		ds=ds1,ds2[***urlencode!***][syntax]
		ds1=condidtion expression
		ds2=index
	layer=layer name["" == "Default"][***urlencode!***]
	Lmt=Level Movement Command
		lmt=NodeInfo\PathInfo
			NodeInfo=Node1:Node2:...:NodeN
				Node=x,y,chance
			PathInfo=Path1:Path2:...:PathN
				Path=NodeID1,NodeID2
next line: layers
	WL|name|status
	name=layer name[***urlencode!***]
	status=is hidden layer
next line: events
	WE|name|layer|layerm|world|other
	name=event name[***urlencode!***]
	layer=way/hidelist/showlist/togglelist
		list=name1,name2,name3...namen
			name[***urlencode!***]
		if (way % 10 == 1) nosmoke = true;
		if (way > 10) object_state = true; else layer_state = true;
	layerm=movementcommand1\movementcommand2\...\movementcommandn
		movementcommand=way,layer,hp,vp,ap
			way:0=speed,1=coordinate,2=moveto,4=spin
			layer=layer name[***urlencode!***]
			hp=Horizontal Parameter[***urlencode!***]
			vp=Vertical Parameter[***urlencode!***]
			ap=Additional Parameter[***urlencode!***]
	world=aw/cs,le,inpc,msgc,syntax,msg
		aw=AutoStart Settings
			0=Not Auto Start
			1=Triggered on loading the world the first time.
			2=Triggered every time loading the world.
			3=Triggered on level exit.
		cs=Start when match all condition[0=false !0=true]
		le:0=This is a Normal Event.
		   1=This is a Level Enter/Exit Event.
		inpc=Interrupt the process if 'false' returned
		msgc=Show a message if 'false' returned
		syntax=Condition expression[***urlencode!***]
		msg=message[***urlencode!***]
	other=sd/ld/event,delay/script/msg/wwx,wwy,lockl
		sd=play sound number
		ld=lock keyboard (frames)
		event=trigger event name[***urlencode!***]
		delay=trigger delay[1 frame]
		script=script name[***urlencode!***]
		msg=show message after start event[***urlencode!***]
		wwx=Warp Whistle: Map Warp Location x
		wwy=Warp Whistle: Map Warp Location y
			if (wwx == -1 && wwy == -1) [means not moving]
		lockl=[Level ID]Affected by Anchor


========================================================
WLS file description(world settings)
========================================================
Data type markers:
G   – Global variables
GS  – Global script UTF-8 Encoded
GSu – Global script ASCII-encoded
CW  – Custom sounds entires (alternate implementation of sounds.ini from PGE and LunaLUA)
--------------------------------------------------------
line 1:
	SMBXFile??
	??=Version number
next line: global variables
	G|name|value
	name=variable name[***urlencode!***]
	value=initial value of the variable
next line: global scripts
	GS|name|script
	GSu|name|scriptu
	name=name of script[***urlencode!***]
	script=script[***base64encode!***][utf-8]
	scriptu=script[***base64encode!***][ASCII]
next line: custom sounds
	CW|cdata1|cdata2|...|cdatan
		cdata=sound-id,sound-filename
			sound-filename:[***urlencode!***]
